package controller

import (
	"github.com/gin-gonic/gin"
	"strconv"
	"wish_go/src/main/com/ajie/dao"
	"wish_go/src/main/com/ajie/model"
	"wish_go/src/main/com/ajie/result"
)

func getTreeRecursive(list []*model.Area, parentCode string) []*model.Area {
	res := make([]*model.Area, 0)
	for _, v := range list {
		if v.ParentCode == parentCode {
			v.Children = getTreeRecursive(list, v.AreaCode)
			res = append(res, v)
		}
	}
	return res
}

// @Tags 社区管理
// @Summary 获取树形结构社区
// @accept json
// @Produce json
// @Security ApiKeyAuth
// @Param parentCode body string false "父级编号"
// @Param name body string false "社区名称"
// @Param shortName body string false "社区简称"
// @Success 200 {object} result.Result "{"code": 200, "message": "操作成功"}"
// @Failure 500 {object} result.Result "{ "code": 500, "message": "异常信息" }"
// @Router /area/tree [POST]
func TreeArea(req *gin.Context) {
	var area = model.Area{}
	// 解析其他参数
	if err := req.BindJSON(&area); err != nil {
		result.Error(req, 500, "参数解析异常："+err.Error())
		return
	}
	rows, dbErr := dao.AllArea(&area)
	if dbErr != nil {
		result.Error(req, 500, "查询失败："+dbErr.Error())
		return
	}
	// 判断数据是否为空
	if len(rows) < 1 {
		result.SuccessData(req, "查询成功", rows)
		return
	}
	// 递归构造区域树
	nodes := getTreeRecursive(rows, "")
	result.SuccessData(req, "查询并构造成功", nodes)
}

// @Tags 社区管理
// @Summary 新增社区
// @accept json
// @Produce json
// @Security ApiKeyAuth
// @Param parentCode body string true "父级编号"
// @Param name body string true "社区名称"
// @Param shortName body string true "社区简称"
// @Success 200 {object} result.Result "{"code": 200, "message": "操作成功"}"
// @Failure 500 {object} result.Result "{ "code": 500, "message": "异常信息" }"
// @Router /area/insert [POST]
func InsertArea(req *gin.Context) {
	area := model.Area{}
	// 解析参数为实体json
	if err := req.BindJSON(&area); err != nil {
		result.Error(req, 500, "参数解析异常："+err.Error())
		return
	}
	user := UserInfo(req)
	if user.Id != 0 {
		area.CreateName = user.Name
	}
	if dbErr := dao.InsertArea(area); dbErr != nil {
		result.Error(req, 500, "添加失败"+dbErr.Error())
		return
	}
	result.Success(req, "添加成功")
}

// @Tags 社区管理
// @Summary 修改社区
// @accept json
// @Produce json
// @Security ApiKeyAuth
// @Param id body int true "唯一标识"
// @Param parentCode body string false "父级编号"
// @Param name body string false "社区名称"
// @Param shortName body string false "社区简称"
// @Success 200 {object} result.Result "{"code": 200, "message": "操作成功"}"
// @Failure 500 {object} result.Result "{ "code": 500, "message": "异常信息" }"
// @Router /area/update [PUT]
func UpdateArea(req *gin.Context) {
	area := model.Area{}
	// 解析参数为实体json
	if err := req.BindJSON(&area); err != nil {
		result.Error(req, 500, "参数解析异常："+err.Error())
		return
	}
	user := UserInfo(req)
	if user.Id != 0 {
		area.UpdateName = user.Name
	}
	if dbErr := dao.UpdateArea(area); dbErr != nil {
		result.Error(req, 500, "更新失败"+dbErr.Error())
		return
	}
	result.Success(req, "更新成功")
}

// @Tags 社区管理
// @Summary 删除社区
// @Produce json
// @Security ApiKeyAuth
// @Param id path int true "唯一标识"
// @Success 200 {object} result.Result "{"code": 200, "message": "操作成功"}"
// @Failure 500 {object} result.Result "{ "code": 500, "message": "异常信息" }"
// @Router /area/delete [DELETE]
func DeleteArea(req *gin.Context) {
	id, _ := strconv.Atoi(req.Param("id"))
	if id == 0 {
		result.Error(req, 500, "id不能为空")
		return
	}
	area := model.Area{}
	area.Id = uint(id)
	if dbErr := dao.DeleteArea(area); dbErr != nil {
		result.Error(req, 500, "删除失败"+dbErr.Error())
		return
	}
	result.Success(req, "删除成功")
}
